package com.lenovo.lcdm.team.service;

import com.lenovo.lcdm.team.dto.GroupDto;
import com.lenovo.lcdm.team.dto.GroupTreeDto;
import com.lenovo.lcdm.team.dto.OperationAuthorityDto;
import com.lenovo.lcdm.team.entity.TeamGroup;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lenovo.lcdm.team.entity.TeamUser;
import com.lenovo.lcdm.team.entity.TeamUserGroup;
import com.lenovo.lcdm.team.vo.GroupVo;

import java.util.List;

/**
 * Group Service
 * @author xujing30
 * @since 2023-12-22
 */
public interface ITeamGroupService extends IService<TeamGroup> {

    /**
     * 查询第一层group
     * @return
     */
    List<GroupTreeDto> getRoot();

    /**
     * 获取组下的子配置（子组或角色）及拥有组的用户
     * @param groupId
     * @return
     */
    GroupTreeDto getGroupInfo(Long groupId, boolean onlyRole) throws Exception;

    /**
     * 查询Group的children（sub group or role）
     * @param groupId
     * @param onlyRole - 是否只查询role
     * @return
     */
    List<GroupTreeDto> getChildren(Long groupId, boolean onlyRole);

    /**
     * 根据groupId查询用户
     * @param groupId
     * @return
     */
    List<TeamUser> getGroupUsers(Long groupId);

    /**
     * 删除组及用户组关系，组角色关系
     * @param groupId
     */
    void deleteGroup(Long groupId);

    /**
     * save/update group, group与role关联关系
     * @param dto
     */
    void saveGroup(GroupDto dto) throws Exception;

    /**
     * 增加用户组关系
     * @param userGroup
     */
    void addUserGroup(TeamUserGroup userGroup) throws Exception;

    /**
     * 批量删除用户的组关系
     * @param groupId
     * @param userIds
     */
    void deleteUserGroup(Long groupId, List<Long> userIds);

    /**
     * 单个删除组下的角色
     * @param groupId
     * @param roleId
     */
    void deleteGroupRole(Long groupId, Long roleId);

    /**
     * 根据name匹配group name（忽略大小写）
     * @param name
     * @return
     */
    List<GroupVo> getGroupByName(String name);

    void operationAuthority(OperationAuthorityDto operationAuthorityDto);

}
